//+------------------------------------------------------------------+
//|                ChartObjectsShapes.mqh MQL5 图表形状工具头文件     |
//|                版权所有 2000-2025, MetaQuotes Ltd.              |
//|                        官方网址: https://www.mql5.com            |
//+------------------------------------------------------------------+
//| 包含所有基础图表形状对象类（矩形、三角形、椭圆形），用于标记价格区间、形态结构 |
//+------------------------------------------------------------------+
#include "ChartObject.h"  // 引入图表对象基类 CChartObject（提供通用属性与生命周期管理）

//+------------------------------------------------------------------+
//| CChartObjectRectangle 类（图表矩形对象）                          |
//| 功能：MQL5 图表矩形工具，用于标记价格波动的矩形区间（如盘整区间、震荡范围） |
//| 继承关系：public CChartObject（基于基础图表对象类，无额外依赖）    |
//| 核心特性：                                                      |
//|  1. 两点定义范围：通过“对角锚点”确定矩形的时间跨度与价格区间        |
//|  2. 随图缩放：矩形大小随图表时间轴/价格轴缩放自动适配，保持相对区间不变 |
//|  3. 区间标记：适用于标记横盘震荡区、价格突破前的整理区间、关键支撑阻力构成的矩形形态 |
//+------------------------------------------------------------------+
class CChartObjectRectangle : public CChartObject
  {
public:
   /**
    * @brief 构造函数：初始化图表矩形对象
    * @details 调用父类 CChartObject 构造函数，初始化矩形对象的基础属性（未绑定图表）
    */
                     CChartObjectRectangle(void);

   /**
    * @brief 析构函数：销毁图表矩形对象
    * @details 依赖父类析构逻辑，自动删除图表上的矩形对象，释放资源
    */
                    ~CChartObjectRectangle(void);

   /**
    * @brief 在指定图表创建矩形对象（通过对角两点定义区间）
    * @param chart_id [in] 目标图表 ID（0 表示当前图表，可通过 ChartID() 获取）
    * @param name [in] 矩形对象唯一名称（图表内不可重复）
    * @param window [in] 子窗口编号（0=主窗口，≥1=指标子窗口）
    * @param time1 [in] 第一个对角锚点的时间坐标（如矩形左上角对应的 K 线时间）
    * @param price1 [in] 第一个对角锚点的价格坐标（如矩形左上角对应的价格）
    * @param time2 [in] 第二个对角锚点的时间坐标（如矩形右下角对应的 K 线时间）
    * @param price2 [in] 第二个对角锚点的价格坐标（如矩形右下角对应的价格）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定完成），false 表示失败
    * @note 1. 两点无需严格区分“左上/右下”，系统会自动计算矩形边界（time1与time2取时间范围，price1与price2取价格范围）；
    *       2. 矩形填充色、边框色、线型等样式可通过父类接口设置（如 Color()、Style() 方法）
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2);

   /**
    * @brief 获取矩形对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_RECTANGLE，代表图表矩形对象）
    */
   virtual int       Type(void) const { return(OBJ_RECTANGLE); }
  };

//+------------------------------------------------------------------+
//| CChartObjectTriangle 类（图表三角形对象）                         |
//| 功能：MQL5 图表三角形工具，用于标记价格趋势中的三角形形态（如对称三角形、上升/下降三角形） |
//| 继承关系：public CChartObject（基于基础图表对象类，无额外依赖）    |
//| 核心特性：                                                      |
//|  1. 三点定义形态：通过“三个顶点锚点”确定三角形的轮廓与结构          |
//|  2. 形态识别：自动连接三点形成闭合三角形，直观展示价格收敛/发散形态    |
//|  3. 趋势信号：适用于标记三角形突破形态（如突破上轨看涨、突破下轨看跌）    |
//+------------------------------------------------------------------+
class CChartObjectTriangle : public CChartObject
  {
public:
   /**
    * @brief 构造函数：初始化图表三角形对象
    * @details 调用父类 CChartObject 构造函数，初始化三角形对象的基础属性（未绑定图表）
    */
                     CChartObjectTriangle(void);

   /**
    * @brief 析构函数：销毁图表三角形对象
    * @details 依赖父类析构逻辑，自动删除图表上的三角形对象，释放资源
    */
                    ~CChartObjectTriangle(void);

   /**
    * @brief 在指定图表创建三角形对象（通过三个顶点锚点定义形态）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 三角形对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 第一个顶点的时间坐标（如三角形左上角顶点对应的 K 线时间）
    * @param price1 [in] 第一个顶点的价格坐标（如三角形左上角顶点对应的价格）
    * @param time2 [in] 第二个顶点的时间坐标（如三角形右上角顶点对应的 K 线时间）
    * @param price2 [in] 第二个顶点的价格坐标（如三角形右上角顶点对应的价格）
    * @param time3 [in] 第三个顶点的时间坐标（如三角形底部顶点对应的 K 线时间）
    * @param price3 [in] 第三个顶点的价格坐标（如三角形底部顶点对应的价格）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定完成），false 表示失败
    * @note 1. 三点顺序不影响形态生成，系统会自动连接三点形成闭合三角形；
    *       2. 建议按形态逻辑选择顶点（如对称三角形选择“高点-低点-高点”或“低点-高点-低点”）；
    *       3. 三角形填充色、边框色等样式可通过父类接口调整，增强形态辨识度
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3);

   /**
    * @brief 获取三角形对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_TRIANGLE，代表图表三角形对象）
    */
   virtual int       Type(void) const { return(OBJ_TRIANGLE); }
  };

//+------------------------------------------------------------------+
//| CChartObjectEllipse 类（图表椭圆形对象）                         |
//| 功能：MQL5 图表椭圆形工具，用于标记价格波动的椭圆形区间（如圆弧顶/底、宽幅震荡区） |
//| 继承关系：public CChartObject（基于基础图表对象类，无额外依赖）    |
//| 核心特性：                                                      |
//|  1. 三点定义轮廓：通过“两个轴端点+一个形状控制点”确定椭圆的大小与扁率    |
//|  2. 曲线区间：相比矩形更适合标记非规则的价格波动范围（如圆弧形态、渐变震荡区） |
//|  3. 形态适配：随图表缩放保持椭圆的相对比例，避免形态失真          |
//+------------------------------------------------------------------+
class CChartObjectEllipse : public CChartObject
  {
public:
   /**
    * @brief 构造函数：初始化图表椭圆形对象
    * @details 调用父类 CChartObject 构造函数，初始化椭圆形对象的基础属性（未绑定图表）
    */
                     CChartObjectEllipse(void);

   /**
    * @brief 析构函数：销毁图表椭圆形对象
    * @details 依赖父类析构逻辑，自动删除图表上的椭圆形对象，释放资源
    */
                    ~CChartObjectEllipse(void);

   /**
    * @brief 在指定图表创建椭圆形对象（通过三个锚点定义轮廓）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 椭圆形对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 第一个锚点的时间坐标（如椭圆水平轴左端点对应的 K 线时间）
    * @param price1 [in] 第一个锚点的价格坐标（如椭圆水平轴左端点对应的价格）
    * @param time2 [in] 第二个锚点的时间坐标（如椭圆水平轴右端点对应的 K 线时间）
    * @param price2 [in] 第二个锚点的价格坐标（如椭圆水平轴右端点对应的价格）
    * @param time3 [in] 第三个锚点的时间坐标（如椭圆垂直轴顶点对应的 K 线时间，用于控制扁率）
    * @param price3 [in] 第三个锚点的价格坐标（如椭圆垂直轴顶点对应的价格，用于控制扁率）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定完成），false 表示失败
    * @note 1. 前两点定义椭圆的“基础轴”（通常为水平或垂直轴），第三点定义椭圆的“高度/宽度”，从而确定扁率；
    *       2. 适用于标记圆弧顶（价格从椭圆左侧上升至顶部后回落）、圆弧底（价格从椭圆左侧下探至底部后回升）等曲线形态；
    *       3. 椭圆的填充透明度可通过父类 Transparency() 方法调整，避免遮挡图表价格数据
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3);

   /**
    * @brief 获取椭圆形对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_ELLIPSE，代表图表椭圆形对象）
    */
   virtual int       Type(void) const { return(OBJ_ELLIPSE); }
  };
//+------------------------------------------------------------------+